import grails.test.*

class VendedorTests extends GrailsUnitTestCase {

    Date fechaTest

    protected void setUp() {
        super.setUp()
        mockDomain(Vendedor)
        Vendedor.list()*.delete()
        fechaTest = new Date()
    }

    protected void tearDown() {
        super.tearDown()
    }


    public Vendedor createVendedorOK(){
        Vendedor v =  new Vendedor(
                cedula:1234567,
                nombres:'Ricardo',
                apellidos:'Yepes',
                fechaVinculacion:fechaTest,
                fechaSalida:fechaTest,
                estado:'Inactivo',
                telefono:'2522426',
                telefonoMovil:'316-712-29-24',
                correoElectronico:'ricardoyepex@gmail.com',
                fechaNacimiento:fechaTest,
                observaciones:'',
                contrasena:'123456')
        return v
    }

    void testOK(){
        Vendedor v = createVendedorOK()
        assert v.cedula==1234567, 'cedula incorrecta'
        assert v.nombres=='Ricardo', 'nombres incorrecta'
        assert v.apellidos=='Yepes', 'apellidos incorrecta'
        assert v.fechaVinculacion==fechaTest, 'fechaVinculacion incorrecta'
        assert v.fechaSalida==fechaTest, 'fechaSalida incorrecta'
        assert v.estado=='Inactivo', 'estado incorrecta'
        assert v.telefono=='2522426', 'telefono incorrecta'
        assert v.telefonoMovil=='316-712-29-24', 'telefonoMovil incorrecta'
        assert v.correoElectronico=='ricardoyepex@gmail.com', 'correoElectronico incorrecta'
        assert v.fechaNacimiento==fechaTest, 'fechaNacimiento incorrecta'
        assert v.observaciones=='', 'observaciones incorrecta'
        assert v.contrasena=='123456', 'contrasena incorrecta'
        assertTrue('Objeto no valido', v.validate())
    }

    void testPersist(){
        Vendedor v = createVendedorOK()
        v.save()
        assertEquals('El vendedor no se guardo en la base de datos', Vendedor.count(), 1)
        Vendedor w = new Vendedor()
        w.save()
        assertEquals('Un vendedor no valido se guardo en la base de datos', Vendedor.count(), 1)
        assertEquals('El vendedor no se recupero correctamente de la base de datos', Vendedor.get(1).cedula, 1234567)
    }

    void testCedula() {
        Vendedor v = createVendedorOK()
        v.cedula = 123456
        assertFalse('Cedulas deben ser de al menos 7 caracteres', v.validate())
        v.cedula = 12345678901
        assertFalse('Cedulas deben ser de maximo 10 caracteres', v.validate())
        v.cedula = -100258
        assertFalse('No pueden haber cedulas negativas', v.validate())
        v.cedula = 1012345.5
        assertTrue('La cedula debe ser un entero', v.validate() && v.cedula == 1012345)
        try{
            v.cedula = 'hola123'
            assert false, 'No se debe poder guardar datos no numericos en la cedula'
        }
        catch(org.codehaus.groovy.runtime.typehandling.GroovyCastException e){ }
        assertTrue('La cedula debe permanecer inalterada por el try', v.cedula == 1012345)
        v.save()
        Vendedor w = createVendedorOK()
        w.cedula = 1012345 //Misma cedula que v
        assertFalse('No pueden haber cedulas duplicadas', w.validate())
    }

    void testNombres(){
        Vendedor v = createVendedorOK()
        v.nombres = ''
        assertFalse('Los nombres no puede estar en blanco', v.validate())
    }

    void testApellidos(){
        Vendedor v = createVendedorOK()
        v.apellidos = ''
        assertFalse('Los apellidos no puede estar en blanco', v.validate())
    }

    void testFechaVinculacion(){
        Vendedor v = createVendedorOK()
        v.fechaVinculacion = null
        assertFalse('La fechaVinculacion no puede ser nula', v.validate())
    }

    void testFechaSalida(){    //
        Vendedor v = createVendedorOK()
        v.fechaSalida = null
        assertTrue('La fechaSalida si puede ser nula', v.validate())
    }

    void testEstado(){
        Vendedor v = createVendedorOK()
        v.estado = ''
        assertFalse('El estado no puede ser nulo', v.validate())
        v.estado = 'Desconocido'
        assertFalse('El estado si puede ser "Desconocido"', v.validate())
        v.estado = 'Activo'
        assertTrue('El estado si puede ser "Activo"', v.validate())
        v.estado = 'Inactivo'
        assertTrue('El estado si puede ser "Inactivo"', v.validate())
    }

    void testTelefono(){
        Vendedor v = createVendedorOK()
        v.telefono = ''
        assertFalse('telefono correcto', v.validate())
        v.telefono = '309-27-13'
        assertTrue('telefono correcto', v.validate())
        v.telefono = '309 27 13'
        assertTrue('telefono correcto', v.validate())
        v.telefono = '3092713'
        assertTrue('telefono correcto', v.validate())
        v.telefono = '309 27 1'
        assertFalse('telefono sin suficientes numeros', v.validate())
        v.telefono = ' 3092713'
        assertFalse('telefono con espacio al principio', v.validate())
    }

    void testTelefonoMovil(){
        Vendedor v = createVendedorOK()
        v.telefonoMovil = ''
        assertFalse('El telefonoMovil no puede estar en blanco', v.validate())
        v.telefonoMovil = '300-309-27-13'
        assertTrue('telefonoMovil correcto', v.validate())
        v.telefonoMovil = '300 309 27 13'
        assertTrue('telefonoMovil correcto', v.validate())
        v.telefonoMovil = '3003092713'
        assertTrue('telefonoMovil correcto', v.validate())
        v.telefonoMovil = '300 309 27 1'
        assertFalse('telefonoMovil sin suficientes numeros', v.validate())
        v.telefonoMovil = ' 3003092713'
        assertFalse('telefonoMovil con espacio al principio', v.validate())
    }

    void testCorreoElectronico(){
        Vendedor v = createVendedorOK()
        v.correoElectronico = ''
        assertFalse('El correoElectronico no puede estar en blanco', v.validate())
        v.correoElectronico = 'rik@matrix.net'
        assertTrue('correoElectronico correcto', v.validate())
        v.correoElectronico = 'rik@.net'
        assertFalse('Sin dominio', v.validate())
        v.correoElectronico = 'rik@matrixnet'
        assertFalse('Falta el punto', v.validate())
        v.correoElectronico = 'rikmatrix.net'
        assertFalse('Falta @', v.validate())
        v.correoElectronico = 'rik@@matrix.net'
        assertFalse('Numero de @ incorrecto', v.validate())
    }

    void testFechaNacimiento(){
        Vendedor v = createVendedorOK()
        v.fechaNacimiento = null
        assertFalse('La fechaNacimiento no puede ser nula', v.validate())
    }

    void testObservaciones(){   //
        Vendedor v = createVendedorOK()
        v.observaciones = ''
        assertTrue('Las observaciones si puede estar en blanco', v.validate())
    }

    void testContrasena(){
        Vendedor v = createVendedorOK()
        v.contrasena = ''
        assertFalse('La contrasena no puede estar en blanco', v.validate())
    }

    void testToString(){
        Vendedor v = createVendedorOK()
        assertEquals(v.toString(), '1234567 - Ricardo Yepes') 
    }

}

